package pl.wroc.pwr.mss.server.ui.dialogs;

import java.awt.Container;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.Border;

import net.miginfocom.swing.MigLayout;
import pl.wroc.pwr.mss.logic.domain.Playlist;
import pl.wroc.pwr.mss.logic.domain.Song;
import pl.wroc.pwr.mss.server.service.PlaylistService;
import pl.wroc.pwr.mss.server.ui.ServerGui;
import pl.wroc.pwr.mss.server.ui.buttons.JAddSongsButton;
import pl.wroc.pwr.mss.server.ui.buttons.JLoadDirectoryButton;
import pl.wroc.pwr.mss.server.ui.buttons.JSavePlaylistButton;
import pl.wroc.pwr.mss.server.ui.input.JPlaylistNameTextField;
import pl.wroc.pwr.mss.server.ui.tables.JSongEditTable;
import pl.wroc.pwr.mss.server.util.JTableUtils;

/**
 * Okno dialogowe przeznaczone do edycji istniejacych playlist jak i tworzenia
 * nowych.
 * 
 * @author mjagus
 */
public class JPlaylistEditDialog extends JDialog
{
    /**
     * Identyfikator klasy.
     */
    private static final long serialVersionUID = -938392416486421863L;

    /**
     * Tytul okna dialogowego podczas tworzenia nowej playlisty.
     */
    private static final String CREATING_TITLE = "Create new playlist";

    /**
     * Tytul okna dialogowego podczas edycji istniejacej playlisty.
     */
    private static final String EDITING_TITLE = "Editing playlist: ";

    /**
     * Serwis dla encji Playlist.
     */
    private PlaylistService playlistService;

    /**
     * Edytowana playlista lub <code>null</code> jesli tworzona jest nowa
     * playlista.
     */
    private Playlist playlist;

    /**
     * Pole tekstowe do podawania nazwy playlisty.
     */
    private JPlaylistNameTextField playlistNameTextField;

    /**
     * Tabela utworow edytowanej/tworzonej playlisty.
     */
    private JSongEditTable songEditTable;

    /**
     * Przycisk od dodawania nowych utworow do playlisty.
     */
    private JAddSongsButton addSongsButton;

    /**
     * Przycisk od wczytywania wybranego katalogu jako playlisty.
     */
    private JLoadDirectoryButton loadDirectoryButton;

    /**
     * Przycisk od zapisywania playlisty.
     */
    private JSavePlaylistButton savePlaylistButton;

    /**
     * Iniciuje okno dialogowe.
     * 
     * @param gui Interfejs aplikacji serwerowej, ktory stanie sie parentnym
     * komponentem dla tego okna
     */
    public JPlaylistEditDialog(ServerGui gui)
    {
        super(gui);

        super.setSize(640, 480);
        super.setLocationRelativeTo(null);
        super.setModalityType(ModalityType.APPLICATION_MODAL);
    }

    /**
     * Iniciuje komponenty tego okna.
     */
    public void initComponents()
    {
        Container pane = super.getContentPane();
        pane.setLayout(new MigLayout());

        playlistNameTextField.setHorizontalAlignment(JTextField.CENTER);

        Border textFieldBorder = BorderFactory.createTitledBorder("Playlist name:");
        JPanel textFieldPanel = new JPanel(new MigLayout());

        textFieldPanel.setBorder(textFieldBorder);
        textFieldPanel.add(playlistNameTextField, "width 100%");

        pane.add(textFieldPanel, "width 100%, span 3, wrap");
        pane.add(new JScrollPane(songEditTable), "width 100%, height 100%, span 3, wrap");
        pane.add(loadDirectoryButton, "hidemode 3");
        pane.add(addSongsButton);
        pane.add(savePlaylistButton, "align right");

        initPlaylist(null);
    }

    /**
     * Iniciuje to okno dialogowe w zaleznosci od zadanego obiektu Playlist.
     * W przypadku gdy do parametru przekazana jest wartosc <code>null</code>,
     * okno dialogowe uruchomi sie w trybie kreacji nowej playlisty. W przeciwnym
     * wypadku okno dialogowe uruchomi sie w trybie edycji playlisty przekazanej
     * w argumencie tej metody.
     * 
     * @param playlist Zadany obiekt typu Playlist.
     */
    public void initPlaylist(Playlist playlist)
    {
        if(playlist == null)
        {
            super.setTitle(CREATING_TITLE);
            playlist = new Playlist();
            playlist.setSongs(new ArrayList<Song>());
            loadDirectoryButton.setVisible(true);

            playlistNameTextField.setText(playlist.getName());
            setPlaylist(playlist);
        }
        else
        {
            super.setTitle(EDITING_TITLE + playlist.getName());
            loadDirectoryButton.setVisible(false);

            playlistNameTextField.setText(playlist.getName());
            setPlaylist(playlist.clone());
        }
    }

    /**
     * @return Serwis dla encji Playlist
     */
    public PlaylistService getPlaylistService()
    {
        return playlistService;
    }

    /**
     * @return Edytowana playlista
     */
    public Playlist getPlaylist()
    {
        return playlist;
    }

    /**
     * @return Pole tekstowe do wpisywania nazwy playlisty
     */
    public JPlaylistNameTextField getPlaylistNameTextField()
    {
        return playlistNameTextField;
    }

    /**
     * @return Tabela z utworami edytowanej/tworzonej playlisty
     */
    public JSongEditTable getSongEditTable()
    {
        return songEditTable;
    }

    /**
     * @return Przycisk do dodawania utworow
     */
    public JAddSongsButton getAddSongsButton()
    {
        return addSongsButton;
    }

    /**
     * @return Przycisk do wczytywania katalogu jako playlisty
     */
    public JLoadDirectoryButton getLoadDirectoryButton()
    {
        return loadDirectoryButton;
    }

    /**
     * @return Przycisk do zapisywania edytowanej playlisty
     */
    public JSavePlaylistButton getSavePlaylistButton()
    {
        return savePlaylistButton;
    }

    /**
     * @param playlistService Serwis dla encji Playlist do ustawienia
     */
    public void setPlaylistService(PlaylistService playlistService)
    {
        this.playlistService = playlistService;
    }

    /**
     * @param playlist Playlista do ustawienia
     */
    public void setPlaylist(Playlist playlist)
    {
        this.playlist = playlist;
        songEditTable.setPlaylist(playlist);
        JTableUtils.adjustColumns(songEditTable);
    }

    /**
     * @param playlistNameTextField Pole tekstowe nazwy playlisty do ustawienia
     */
    public void setPlaylistNameTextField(JPlaylistNameTextField playlistNameTextField)
    {
        this.playlistNameTextField = playlistNameTextField;
    }

    /**
     * @param songEditTable Tabela z utworami edytowanej/tworzonej playlisty do
     * ustawienia
     */
    public void setSongEditTable(JSongEditTable songEditTable)
    {
        this.songEditTable = songEditTable;
    }

    /**
     * @param addSongsButton Przycisk do dodawania nowych utworow
     */
    public void setAddSongsButton(JAddSongsButton addSongsButton)
    {
        this.addSongsButton = addSongsButton;
    }

    /**
     * @param loadDirectoryButton Przycisk do wczytywania katalogu jako playlisty
     */
    public void setLoadDirectoryButton(JLoadDirectoryButton loadDirectoryButton)
    {
        this.loadDirectoryButton = loadDirectoryButton;
    }

    /**
     * @param savePlaylistButton Przycisk do zapisywania edytowanej playlisty
     */
    public void setSavePlaylistButton(JSavePlaylistButton savePlaylistButton)
    {
        this.savePlaylistButton = savePlaylistButton;
    }
}
